//
//  LspNbTabBarViewController.swift
//  LspSwiftFinayTest
//
//  Created by lsp's mac pro on 2018/3/27.
//  Copyright © 2018年 lsp's mac pro. All rights reserved.
//


// MARK: - UIButton的两种写法
// btn.setTitle("lalala", for: UIControlState(rawValue: 0))
// btn.setTitle("lalala", for: [])



import UIKit

class LspNbTabBarViewController: UITabBarController {

    private var timer : Timer?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
       setupChildControllers()
        setupComposeButton()
        setupNewNoun()
//        setUpTimer()
        delegate=self
//        测试未读数量
//        LspNbNetWorkManage.shared.getFreshCount { (count) in
//            print(count)
//        }
        
        //登录通知注册
        NotificationCenter.default.addObserver(self, selector: #selector(userLogin), name: NSNotification.Name(rawValue: lspNbSwiftUserShouldLogin), object: nil);
    }
    
    
    
    //接收登录通知的方法
    @objc private func userLogin(noc:Notification){
        print("\(noc)")
        var when = DispatchTime.now()
        
        if noc.userInfo != nil {
            SVProgressHUD.setDefaultMaskType(.gradient)
            SVProgressHUD.showInfo(withStatus: "用户登录已超时，需重新登录")
            when = DispatchTime.now() + 2
        }
        
        DispatchQueue.main.asyncAfter(deadline: when) {
            
            let controller = LspNbLoginViewController()
            let nav = UINavigationController(rootViewController: controller)
            self.present(nav, animated: true, completion: nil)
        }
        
    
    }
    //编写微博的点击方法
    //private 能够保证方法私有，仅当前对象被访问
    //@objc 允许这个函数在运行时 通过 oc的消息机制被调用
    @objc private func composeStatus()  {
     print("开始编辑")
    }
    
    /*
     设置屏幕 横屏 竖屏
     portrait :竖屏 肖像
     landscape :横屏 ，风景画
     - 使用代码控制设备的方向，好处 可以在需要的时候横屏
     //swift3 中 要重写它的get方法才可以
     //设置了此支持方向之后，当前的控制器及子控制器都会遵守这个方向
     //如果播放视频时候  一般通过模态跳出
     
     */
    override var supportedInterfaceOrientations:UIInterfaceOrientationMask{
        
      return UIInterfaceOrientationMask.portrait
        
    }
    
    override var shouldAutorotate:Bool{
        
        return false
        
    }
    

    lazy var composeButton:UIButton=UIButton.cz_imageButton("tabbar_compose_icon_add    ", backgroundImageName: "tabbar_compose_button")

}
extension LspNbTabBarViewController{
  private  func setupNewNoun() {
    
    //判断是否登录
    if !LspNbNetWorkManage.shared.userLogan {
        return
    }
    /*版本号  在appstore每次升级应用程序，版本号都需要增加
     
     第一位数字：主版本号 最大改动
     第二位数字：次版本号 中级改动
     第三位数字： 内部bug 不影响用户使用等
     */

        //1.检查版本是否更新
        let v = isNewVersion ? LspNbNewNounView.nounView() : LspNbWeclomeView.welcomeView()
    
        //2.如果更新显示新特性页面  否则现实欢迎页面
        v.frame=view.bounds
        view.addSubview(v)
        //3.添加视图
        
    }
    
    //extension 中计算型属性不占用内存空间
    private var isNewVersion:Bool{
        
        //应该有的逻辑
        //1.取当前的版本号
//        print(Bundle.main.infoDictionary ?? "")
        let currentVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
        print(currentVersion)
        //2.取保存在沙盒里面的版本号进行对比
        let path:String = ("version" as NSString).cz_appendDocumentDir()
        let sandboxVersion = (try? String(contentsOfFile:path)) ?? ""
        print(sandboxVersion)
        //3.将当前版本号存在沙盒中
        _ = try? currentVersion.write(toFile: path, atomically: true, encoding: .utf8)
        //4.返回两个版本号是否一致
//        return currentVersion == sandboxVersion
        //测试代码 （这样可以测试新特性视图）
        return false
        
        
    }
}
extension LspNbTabBarViewController : UITabBarControllerDelegate{
    
    //这个是将要点击tabbar上面的按钮的时候是否跳转  这里的判断是 如果是navgationcontroller 的时候跳转 不是navgation 的时候不跳转
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        let index = (childViewControllers as NSArray).index(of: viewController)
        
        if selectedIndex==index && selectedIndex==0{
            print("点击首页")
            let nav = childViewControllers[0] as! UINavigationController
            let vc = nav.childViewControllers[0] as! LspNbHomeViewController
            
            vc.tableView?.setContentOffset(CGPoint(x:0 , y:-64), animated: true)
          
            //延时加载
            DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
              vc.loadData()
            }
        }
        
        return !viewController.isMember(of: UIViewController.self)
    }
}

extension LspNbTabBarViewController {
    //添加时间器的方法
    func setUpTimer() {
        if !LspNbNetWorkManage.shared.userLogan {
            return
        }
        
        timer=Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
    }
    //时间器走的时候要干的事儿
  @objc func updateTimer() {
    //测试未读数量
    LspNbNetWorkManage.shared.getFreshCount { (count) in
        print(count)
        //在tabbar的第一个按钮上面加上显示未读刷新的微博的数量
        self.tabBar.items?[0].badgeValue = count>0 ? "\(count)":nil
        UIApplication.shared.applicationIconBadgeNumber=count;
       }
    }
}
//extension类似于oc中的分类，在swit中还可以用来切分代码块
//可以把相近功能的函数，放在一个extension中
//便于代码维护
//注意：和oc的分类一样，extension中不能定义属性 只能定义方法
extension LspNbTabBarViewController{
    
    
    //添加中间按钮
    func setupComposeButton()  {
        tabBar.addSubview(composeButton)
        //为了计算 强专int
        let count = CGFloat(childViewControllers.count)
       //计算tabbar中一个按钮的宽度
        let w = tabBar.bounds.width/count-1
        //正数向内 负数向外   x或者y同等
        composeButton.frame=tabBar.bounds.insetBy(dx: 2*w, dy: 0)
        composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)
    }
    
    
    //设置所有子控制器（可以根据json文件动态配置）
    private func setupChildControllers()  {
        
    //获取沙盒路径
        /*从沙盒中获取json文件判断里面是否有值，如果有的话就往下走，如果没有的话就获取本地的取本地的json文件来使用*/
    let docDir=NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let jsonPath=(docDir as NSString) .appendingPathComponent("demo.json")
        
    var data = NSData (contentsOfFile:jsonPath)
        
        if data==nil {
          let path=Bundle.main.path(forResource: "demo.json", ofType: nil)
            data = NSData(contentsOfFile:path!)
        }
        guard let array = try!JSONSerialization.jsonObject(with: data! as Data, options: []) as? [[String:Any]]
        
    else {
        return
    }
    

    
    
    var arrayM = [UIViewController]()
    //遍历数组，循环创建控制器数组
    for dict in array {
        arrayM.append(controller(dict: dict as [String : AnyObject]))
        viewControllers=arrayM
    }
    
    }
    
    //使用字典创建一个子控制器
    //参数 clsName  title  imageName cls
    private func controller(dict:[String:AnyObject]) -> UIViewController {
        guard let clsName = dict["clsName"] as? String,
            let title = dict["title"] as? String,
            let imageName = dict["imageName"] as? String,
            let cls = NSClassFromString(Bundle.main.namespace + "." + clsName) as? LspNbBaseViewController.Type,
            let visitorDict = dict["visitorInfo"] as? [String:String]
            
            
        else{
                
                return UIViewController()
        }
        //2.创建视图控制器
        let vc = cls.init()
        vc.title = title
        vc.visitorInfoSend=visitorDict
        //设置图像
        vc.tabBarItem.image=UIImage(named:"tabbar_"+imageName)
   /*3.设置选中图像*/ vc.tabBarItem.selectedImage=UIImage(named:"tabbar_"+imageName+"_selected")?.withRenderingMode(.alwaysOriginal)
        //4.设置选中字体颜色
        //注意 这里NSAttributedStringKey.foregroundColor  这个是最新的 以前的写法作废
    vc.tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.orange], for: .highlighted)
        
        //修改tabbar字体大小
    vc.tabBarItem.setTitleTextAttributes([NSAttributedStringKey.font:UIFont.systemFont(ofSize: 12)], for: UIControlState(rawValue:0))
            
        let nav = LspNbNavViewController(rootViewController: vc)
        return nav
        
        
    }
}
